@echo off
chcp 65001 >nul
echo 功能：将当前目录下的所有文件（文件名格式：全局序号_组内序号），按组别序列化重命名（目标格式：组别序号_组内序号）

setlocal EnableDelayedExpansion

:: 让用户输入起始组别号，若没输入默认为 1
set /p start_group=请输入起始组别号（默认1）：
if "%start_group%"=="" set start_group=1

:: 检查输入是否为有效数字
echo %start_group%| findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 (
    echo 输入错误，请输入有效的数字！
    pause
    exit
)

:: 记录开始时间（秒）
for /f "tokens=1-4 delims=:.," %%a in ("%TIME%") do (
    set /a start_seconds=%%a*3600 + %%b*60 + %%c
    set start_milliseconds=%%d
)

:: 初始化变量
set /a group_num=%start_group%-1
set /a total_groups=0
set /a inner_seq=0
set /a prev_inner_seq=0
set "first_file=1"

:: 获取当前 BAT 文件名，防止重命名自身
set "bat_file=%~nx0"

:: 全部文件重命名为临时名称（防止重命名过程中文件名冲突）
for /f "delims=" %%F in ('dir /b /a-d /on') do (
    if /I not "%%F"=="%bat_file%" (
        ren "%%F" "__tmp_%%F"
    )
)

:: 再重命名为最终目标名称
for /f "delims=" %%F in ('dir /b /a-d /on ^| findstr /b "__tmp_"') do (
    set "filename=%%~nF"
    set "extension=%%~xF"

    :: 去掉临时前缀
    set "orig=!filename:~6!"

    :: 提取原始组内序号
    for /f "tokens=2 delims=_" %%A in ("!orig!") do set "inner_seq_raw=%%A"

    :: 转换为数字（去除前导零）
    set /a current_inner_seq=!inner_seq_raw! 2>nul

    :: 判断是否新组
    if !first_file! equ 1 (
        set /a group_num+=1
        set /a total_groups+=1
        set /a inner_seq=0
        set /a first_file=0
        echo 正在处理组别：!group_num!
    ) else if !current_inner_seq! lss !prev_inner_seq! (
        set /a group_num+=1
        set /a total_groups+=1
        set /a inner_seq=0
        echo 正在处理组别：!group_num!
    )

    :: 保存当前组内序号
    set /a prev_inner_seq=!current_inner_seq!

    :: 组内序号递增
    set /a inner_seq+=1

    :: 生成新文件名（格式：三位组号_三位组内序号）
    set "new_group=000!group_num!"
    set "new_inner_seq=000!inner_seq!"
    set "new_name=!new_group:~-3!_!new_inner_seq:~-3!!extension!"

    :: 重命名文件
    ren "%%F" "!new_name!"
)

:: 记录结束时间（秒）
for /f "tokens=1-4 delims=:.," %%a in ("%TIME%") do (
    set /a end_seconds=%%a*3600 + %%b*60 + %%c
    set end_milliseconds=%%d
)

:: 计算耗时（秒）
set /a elapsed_seconds=end_seconds - start_seconds
if %elapsed_seconds% lss 0 set /a elapsed_seconds+=86400

:: 输出结果
echo 处理完成，总计处理组别数：%total_groups%（耗时 %elapsed_seconds% 秒）
set /p dummy=按 Enter 键关闭：
exit